iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
自我挑戰組

30天開啟.NET後端工程師的旅程系列 第 29

Day29 建立安全的ASP.NET Core Web API註冊服務

  • 分享至 

  • xImage
  •  

前言

關於C#基本的概念,使用Mvc,使用ASP.NET Core Web API這些前面幾天都有簡單的說明。
最後這兩天,想要使用Jwt Token的方式來完成註冊後成功登入回傳的資訊。


首先當然是建立一個ASP.NET Core Web API ,這次使用.Net 7.0的版本
https://ithelp.ithome.com.tw/upload/images/20231011/20151470Wk4S0szfXC.png
在我們建立專案的地方右鍵建立一個資料夾,名稱叫做Models,裡面要建立兩個類別,一個是User,一個是UserDto

public class User
	{
      public string Username { get; set; } = string.Empty;
			public string PasswordHash { get; set; } = string.Empty;
    }
public class UserDto
	{
		public required string Username { get; set; } 
		public required string Password { get; set; } 
	}

在Controller資料夾裡面建立一個空白的API Controller
https://ithelp.ithome.com.tw/upload/images/20231011/20151470O1qjotxyca.png

在NuGet套件管理,安裝bcrypt.net-Next的套件。
https://ithelp.ithome.com.tw/upload/images/20231011/20151470rNxtjx0gcP.png
在建立好的Controller裡面,首先要來寫註冊的方法,那註冊register會員使用的動作就像是新增一個使用者一樣,所以應該使用的是Post

public class UserController : ControllerBase
	{
		public static User user = new User();//宣告了一個名為 **user** 的**User**對象,並設為static靜態成員,表示無論何時訪問這個類別都會使用相同的User對象。

		[HttpPost("register")]
		public ActionResult<User>Register(UserDto request)
		{
			//使用了 **BCrypt.Net** 函式庫來將 **request.Password** 中的密碼進行哈希處理,處理後的密碼存儲在 **passwordHash** 變數中。
			string passwordHash = BCrypt.Net.BCrypt.HashPassword(request.Password);

			user.Username = request.Username;
			user.PasswordHash = passwordHash;

			return Ok(user);
		}
	}
  1. [HttpPost("register")]:這是一個屬於ASP.NET Core Web API的標記性屬性,它告訴應用程式這個方法應該處理HTTP POST請求,並且請求的路徑(Endpoint)應該是 "/register"。換句話說,當應用程式收到一個HTTP POST請求,其路徑為 "/register" 時,將調用這個方法。
  2. public ActionResult<User> Register(UserDto request):這是一個C#方法的定義,該方法接受一個 UserDto 對象作為參數,並返回一個 ActionResult<User> 類型的結果。這種結果通常用於表示HTTP請求的回應。
  3. string passwordHash = BCrypt.Net.BCrypt.HashPassword(request.Password);:這一行使用了 BCrypt.Net 函式庫來將 request.Password 中的密碼進行哈希處理。BCrypt是一種安全的密碼哈希算法,通常用於將密碼安全地存儲在資料庫中。哈希處理後的密碼存儲在 passwordHash 變數中。
  4. user.Username = request.Username;user.PasswordHash = passwordHash;:這兩行將從請求中接收到的 request.Username 和上一步計算出的 passwordHash 分別存儲在 user 對象的 UsernamePasswordHash 屬性中。這樣,用戶的用戶名和密碼哈希值就被設定了。
  5. return Ok(user);:最後,這一行代表成功的HTTP回應,其中包含了 user 對象的信息。換句話說,當用戶成功註冊時,服務器將返回一個HTTP 200 OK回應,並將用戶的信息包含在回應中。

再來把建立好的部分操作執行試看看。
https://ithelp.ithome.com.tw/upload/images/20231011/20151470ATvTa4mZH7.png
上面的passwordHash跟如果再Execute一次試試看,可以確認確實密碼會是不一樣的。
https://ithelp.ithome.com.tw/upload/images/20231011/20151470Sd6tOQ9MEH.png
再來註冊完成就是可以做登入瞜~

那登入就需要進行檢測確認,是否有這個Username,有的話才可以登入。

[HttpPost("login")]
		public ActionResult<User> Login(UserDto request)
		{
			if(user.Username != request.Username) { return BadRequest("User not found."); }
			if (!BCrypt.Net.BCrypt.Verify(request.Password, user.PasswordHash))
			{
				return BadRequest("Wrong Username Or Password");
			}
			return Ok(user);
		}

那先來註冊,usrname這邊輸入iron,password不變,使用預設的string。
https://ithelp.ithome.com.tw/upload/images/20231011/20151470NRr7FXFnne.png
那我們來試著登入看看,可以看到下面Response body顯示的是我們設定的錯誤訊息User not found。
https://ithelp.ithome.com.tw/upload/images/20231011/201514708QcRhYMahA.png
那改成Username輸入正確,但是密碼輸入錯誤的話,可以看到顯示的是錯誤的使用者名稱或密碼,這裡為什麼不寫錯誤的密碼呢?
是因為,如果顯示的錯誤訊息是密碼錯誤,那有心人士就可以針對密碼作攻擊測試,如果顯示的是使用者名稱或密碼就可以多一點點保護,一點可以注意的小細節這樣。
https://ithelp.ithome.com.tw/upload/images/20231011/20151470Q2B0dhe613.png
再來就是在嘗試登入,確認是否成功登入摟~
https://ithelp.ithome.com.tw/upload/images/20231011/20151470O66t9DMbPu.png
下面這是剛剛在register這裡創建的帳號密碼,可以看到上下圖的密碼是一樣的
https://ithelp.ithome.com.tw/upload/images/20231011/20151470fMR9N3Z2fY.png


第29天挑戰完成!!!剩下最後一天了!!!!


上一篇
加強安全性 - 使用BCrypt和JWT實現強大的身分驗證
下一篇
Day 30 實現Jwt Token身分驗證的ASP.NET Core Web API登入
系列文
30天開啟.NET後端工程師的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言